Agent 记忆
前置:做过一个多轮对话的应用。知道每次请求都要把历史消息一起发给模型就够了。
本专题回答:什么该记、存成什么样、用户改口了怎么办、下次怎么把对的那几条取回来,以及什么情况下根本不该上这一层。
同一个用户,上周说过"我对花生过敏",这周问"推荐个川菜馆"。会话结束时 messages 数组被丢掉,下一次请求里没有任何关于花生的字节 —— 模型不是忘了,是根本没收到。
记忆层就是补上这一段:从已经结束的会话里挑出值得留下的东西,存到会话之外,在下一次需要时放回上下文。本专题拆解这件事的四个动作 —— 挑什么、怎么存、怎么改、怎么取回 —— 以及它们各自会怎么坏。
先约定几个词,本专题全程使用:
| 词 | 意思 |
|---|---|
| 上下文(context) | 这一次请求真正发给模型的那串 token。它是易失的,请求结束就没了 |
| 记忆(memory) | 存在上下文之外、能跨会话活下来的东西。记忆本身不产生效果,只有被读回上下文才有效果 |
| 抽取(extraction) | 用一次额外的模型调用,从对话里挑出"值得记住的事实"。绝大多数 记忆库的写入路径第一步 |
| 情景 / 语义 / 程序记忆 | 记忆的三种分型:发生过什么、事实是什么、该怎么做。01 篇细讲 |
| 巩固(consolidation) | 新事实进来时,跟已有记忆比对、合并、改写或作废的过程。冲突消解发生在这里 |
| 双时间轴(bi-temporal) | 同时记录"事实在现实中何时成立"和"系统何时知道这件事"两条时间线。03 篇细讲 |
| 热路径 / 后台 | 记忆写入的两种时机:在用户等回复的这一轮里写(热路径),还是回复完再异步写(后台) |
| 记忆投毒 | 攻击者诱导 Agent 把伪造事实写进记忆,之后每一轮都被读回来。07 篇细讲 |
一、这一层要解决的六个问题
二、八篇正文
| # | 标题 | 读完能回答的问题 |
|---|---|---|
| 01 | 记忆与上下文的边界 | 上下文、记忆、RAG、检查点这四个词到底哪里不一样?我这个需求是不是根本不需要记忆层 |
| 02 | 写入路径:什么该被 记下来 | 一整段对话里,哪几句值得存?该在用户等回复的时候存还是回完再存?多花的这次模型调用要多少钱 |
| 03 | 冲突、遗忘与时间 | 用户上个月说住北京,这个月说住上海 —— 旧的那条该删吗?为什么直接删掉几乎总是错的 |
| 04 | 读取路径:向量、图与结构化 | 存了几千条,这一轮该取哪几条?为什么只按相似度取会漏掉最该取的那条?取回来放在提示词的哪个位置 |
| 05 | 文件系统式记忆 | 能不能干脆让模型自己写文件、自己读文件?这条路好在哪,又在哪里撑不住 |
| 06 | 开源实现横评 | 十五个现成的库该挑哪个?装起来各自要拖多少依赖、协议能不能商用、有哪四个坑是看 README 看不出来的 |
| 07 | 失败模式、评测与选型 | 记忆里被人塞了假事实会怎样?A 用户的记忆会不会串到 B 那里?各家宣传的评测分数能不能信 |
| 08 | 两个大厂实现拆解 | 字节和腾讯是怎么做的?用前七篇的框架逐条对一遍,看它们各自选了哪条路、共同留下了哪三处空白 |
只读两篇的话:02 篇(写入路径)和 07 篇(失败模式与评测)。前者决定你能记住什么,后者决定你能不能相信自己记住的东西。想直接看别人怎么做的,跳 08 篇。
三、榜单数字目前不可比
LoCoMo 是这个领域引用最多的基准。同一个系统在同一个基准上,公开材料里出现过四个分数,最低 58.44%、最高 84% —— 不是实现不同,是评测口径和配置方式不同。完整的争议链条在 07 篇第四节。
在读到那篇之前,先记住一条:看到"我们在 LoCoMo 上比 X 高 26%"这类表述,先问用的哪个子集、谁跑的 X、用的什么嵌入模型。2026 年的对照实验(MemDelta)显示,只换嵌入模型这一个变量就能让结论反向。
四、本专题拆解的对象
许可证一列不是照抄仓库首页的标签,而是逐个打开许可证文件读出来的 —— 这一栏和你能不能把它用在公司项目里直接相关,下面会看到好几处两者不一致。
4.1 十五个开源实现
按出身分两组 —— 大厂那一组的共同特点是把记忆做成团队级共享资产,独立项目那一组更多是给单个应用用的库。
大厂与云厂商
| 项目 | ★ | 许可证(实读) | 形态 |
|---|---|---|---|
volcengine/OpenViking | 33,440 | AGPL-3.0(crates/ov_cli 与 examples 为 Apache-2.0) | 字节跳动火山引擎。把记忆、资源、技能统一成 viking:// 虚拟文件系统,L0/L1/L2 三层按需加载,Rust + Python |
TencentCloud/TencentDB-Agent-Memory | 24,556 | MIT(gh 返回 NOASSERTION,因文件开头有腾讯的声明段) | 腾讯云。团队级记忆中枢,L0 到 L3 四层 + 权限绑定,TypeScript |
agentscope-ai/ReMe | 3,354 | Apache-2.0 | 阿里 AgentScope 团队。本地优先的 Markdown 记忆,reme-ai 0.4.1.7。原 modelscope/MemoryScope,改名迁仓后旧地址 301 跳转 |
独立项目
| 项目 | ★ | 许可证(实读) | 形态 |
|---|---|---|---|
mem0ai/mem0 | 64,075 | Apache-2.0 | 抽取式记忆层,向量库 + 可选图库,mem0ai 2.0.19 |
getzep/graphiti | 30,319 | Apache-2.0 | 时序知识图引擎,Zep 的开源内核,graphiti-core 0.29.3 |
topoteretes/cognee | 30,268 | Apache-2.0 | 知识图 + 向量的记忆平台,cognee 1.5.3 |
supermemoryai/supermemory | 29,074 | MIT | TypeScript,记忆 + RAG + 连接器一体 |
memvid/memvid | 16,448 | Apache-2.0 | Rust,单文件、免服务的记忆层 |
MemoriLabs/Memori | 16,224 | Apache-2.0(gh 同样判 NOASSERTION) | 记录 Agent 执行过程本身,而不只是对话 |
NevaMind-AI/memU | 14,347 | Apache-2.0(文件名是 LICENSE.txt) | 把记忆存成 Wiki 文件,挂到各家 Agent 客户端上 |
EverMind-AI/EverOS | 12,438 | Apache-2.0 | 本地优先、Markdown 原生、跨 Agent 可移植 |
MemTensor/MemOS | 10,996 | Apache-2.0 | 统一记忆 API,图结构可读可改 |
plastic-labs/honcho | 6,844 | AGPL-3.0 | 建仓最早(2023-09)。与 OpenViking 同为 AGPL,作为服务对外提供时有传染性,选型前先过法务 |
letta-ai/letta-code | 3,122 | Apache-2.0 | Letta(原 MemGPT)当前源码,git 版本化的记忆目录 |
langchain-ai/langmem | 1,626 | MIT | LangGraph 生态的记忆原语,PyPI 仍停在 0.0.30 |